package br.com.insight.consultoria.apresentacao.curriculo;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.faces.event.ActionEvent;

import br.com.insight.consultoria.apresentacao.messagebean.InsightMB;
import br.com.insight.consultoria.entity.ConhecimentoInformatica;
import br.com.insight.consultoria.entity.ConhecimentoLinguaEstrangeira;
import br.com.insight.consultoria.entity.Tipo;
import br.com.insight.consultoria.entity.TipoEspecifico;
import br.com.insight.consultoria.entity.Usuario;
import br.com.insight.consultoria.erro.exception.InsightException;
import br.com.insight.consultoria.negocio.fachada.area.FachadaArea;
import br.com.insight.consultoria.negocio.fachada.conhecimentlinguaestrangeira.FachadaConhecimentoLinguaEstrangeira;
import br.com.insight.consultoria.negocio.fachada.conhecimentoinformatica.FachadaConhecimentoInformatica;
import br.com.insight.consultoria.negocio.fachada.tipo.FachadaTipo;
import br.com.insight.consultoria.negocio.fachada.tipoEspecifico.FachadaTipoEspecifico;

public class CurriculoInformacoesComplementaresMB extends InsightMB{
	
	private FachadaConhecimentoLinguaEstrangeira fachadaConhecimentoLinguaEstrangeira;
	private FachadaConhecimentoInformatica fachadaConhecimentoInformatica;
	private ConhecimentoLinguaEstrangeira linguaEstrangeira;
	private ConhecimentoInformatica informatica;
	private FachadaTipoEspecifico fachadaTipoEspecifico;
	private FachadaTipo fachadaTipo;
	private FachadaArea fachadaArea;
	private Tipo tipoInformatica;
	private TipoEspecifico tipoEspecificoInformatica;
	private TipoEspecifico tipoEspecificoLinguaEstrangeira;
	private Usuario usuario;

	
	public void inserirLinguaEstrangeira(ActionEvent e) throws InsightException{
		getFachadaConhecimentoLinguaEstrangeira().inserir(conhecimentoLinguaEstrangeiraObject(linguaEstrangeira));
		setLinguaEstrangeira(null);
		setTipoEspecificoLinguaEstrangeira(null);
	}
	
	public void excluirLinguaEstrangeira(ActionEvent e) throws NumberFormatException, InsightException{
		ConhecimentoLinguaEstrangeira linguaEstrangeira=new ConhecimentoLinguaEstrangeira(getUsuario(),getTipoEspecificoLinguaEstrangeira(),getFachadaTipo().getTipo(new Long("3")));
		getFachadaConhecimentoLinguaEstrangeira().excluir(getFachadaConhecimentoLinguaEstrangeira().getConhecimentoUsuario(linguaEstrangeira.getId()));
		setLinguaEstrangeira(new ConhecimentoLinguaEstrangeira());
		setTipoEspecificoLinguaEstrangeira(new TipoEspecifico());
	}
	
	public void carregaLinguaEstrangeira(ActionEvent e) throws InsightException{
		ConhecimentoLinguaEstrangeira linguaEstrangeira=new ConhecimentoLinguaEstrangeira(getUsuario(),getTipoEspecificoLinguaEstrangeira(),getFachadaTipo().getTipo(new Long("3")));
		setLinguaEstrangeira(getFachadaConhecimentoLinguaEstrangeira().getConhecimentoUsuario(linguaEstrangeira.getId()));
	}
	
	public void inserirInformatica(ActionEvent e) throws InsightException{
		getFachadaConhecimentoInformatica().inserir(conhecimentoInformatica(informatica));
		setTipoInformatica(null);
		setTipoEspecificoInformatica(null);
		setInformatica(null);
	}

	public void excluirInformatica(ActionEvent e) throws InsightException{
		ConhecimentoInformatica conhecimentoInformatica=new ConhecimentoInformatica(getUsuario(),getTipoEspecificoInformatica(),getTipoInformatica());
		getFachadaConhecimentoInformatica().excluir(conhecimentoInformatica);
		setTipoInformatica(new Tipo());
		setTipoEspecificoInformatica(new TipoEspecifico());
		setInformatica(new ConhecimentoInformatica());
		
	}
	
	public void carregaInformatica(ActionEvent e) throws InsightException{
		ConhecimentoInformatica conhecimentoInformatica=new ConhecimentoInformatica(getUsuario(),getTipoEspecificoInformatica(),getTipoInformatica());
		setInformatica(getFachadaConhecimentoInformatica().getConhecimentoUsuario(conhecimentoInformatica.getId()));
	}
	
	public TipoEspecifico getTipoEspecificoLinguaEstrangeira() {
		if(tipoEspecificoLinguaEstrangeira==null)
			tipoEspecificoLinguaEstrangeira=new TipoEspecifico();
		return tipoEspecificoLinguaEstrangeira;
	}

	public void setTipoEspecificoLinguaEstrangeira(
			TipoEspecifico tipoEspecificoLinguaEstrangeira) {
		this.tipoEspecificoLinguaEstrangeira = tipoEspecificoLinguaEstrangeira;
	}

	public FachadaConhecimentoLinguaEstrangeira getFachadaConhecimentoLinguaEstrangeira() {
		return fachadaConhecimentoLinguaEstrangeira;
	}
	
	public void setFachadaConhecimentoLinguaEstrangeira(
			FachadaConhecimentoLinguaEstrangeira fachadaConhecimentoLinguaEstrangeira) {
		this.fachadaConhecimentoLinguaEstrangeira = fachadaConhecimentoLinguaEstrangeira;
	}
	
	public FachadaConhecimentoInformatica getFachadaConhecimentoInformatica() {
		return fachadaConhecimentoInformatica;
	}
	
	public void setFachadaConhecimentoInformatica(
			FachadaConhecimentoInformatica fachadaConhecimentoInformatica) {
		this.fachadaConhecimentoInformatica = fachadaConhecimentoInformatica;
	}

	public ConhecimentoInformatica getInformatica() {
		if(informatica==null)
			informatica=new ConhecimentoInformatica();
		informatica.setUsuario(getUsuario());
		return informatica;
	}
	public void setInformatica(
			ConhecimentoInformatica informatica) {
		this.informatica = informatica;
	}
	
	public FachadaTipo getFachadaTipo() {
		return fachadaTipo;
	}
	public void setFachadaTipo(FachadaTipo fachadaTipo) {
		this.fachadaTipo = fachadaTipo;
	}
	
	public FachadaTipoEspecifico getFachadaTipoEspecifico() {
		return fachadaTipoEspecifico;
	}
	public void setFachadaTipoEspecifico(FachadaTipoEspecifico fachadaTipoEspecifico) {
		this.fachadaTipoEspecifico = fachadaTipoEspecifico;
	}
	
	public ConhecimentoLinguaEstrangeira getLinguaEstrangeira() throws NumberFormatException, InsightException {
		if(linguaEstrangeira==null)
			linguaEstrangeira=new ConhecimentoLinguaEstrangeira(getUsuario(),
					getTipoEspecificoLinguaEstrangeira(),
					getFachadaTipo().getTipo(new Long("3")));
		
		return linguaEstrangeira;
	}
	
	private void setLinguaEstrangeira(
			ConhecimentoLinguaEstrangeira linguaEstrangeira) {
		this.linguaEstrangeira = linguaEstrangeira;
	}
	
	public FachadaArea getFachadaArea() {
		return fachadaArea;
	}

	public void setFachadaArea(FachadaArea fachadaArea) {
		this.fachadaArea = fachadaArea;
	}
	
	public Tipo getTipoInformatica() {
		if(tipoInformatica==null)
			tipoInformatica=new Tipo();
		return tipoInformatica;
	}

	public void setTipoInformatica(Tipo tipoInformatica) {
		this.tipoInformatica = tipoInformatica;
		informatica.setTipo(getTipoInformatica());
	}
	
	public TipoEspecifico getTipoEspecificoInformatica() {
		if(tipoEspecificoInformatica==null)
			tipoEspecificoInformatica=new TipoEspecifico();
		return tipoEspecificoInformatica;
	}

	public void setTipoEspecificoInformatica(
			TipoEspecifico tipoEspecificoInformatica) {
		this.tipoEspecificoInformatica = tipoEspecificoInformatica;
		informatica.setTipoEspecifico(getTipoEspecificoInformatica());
	}
	
	private Usuario getUsuario() {
		usuario=new Usuario();
		usuario.setId(new Long("12345678901"));
		return usuario;
	}

	public Map<String, Object> getListaLinguaEstrangeira() throws NumberFormatException, InsightException{
		Map<String, Object> linguaEstrangeira=new HashMap<String, Object>();
		for(TipoEspecifico tipoEspecifico: getFachadaTipoEspecifico().listarTipoEspecifico(getFachadaTipo().getTipo(new Long("3")))){
			linguaEstrangeira.put(tipoEspecifico.getTipoEspecifico(),tipoEspecifico.getId());
		}
		return linguaEstrangeira;
	}
	
	public Map<String, Object> getListaInformatica() throws NumberFormatException, InsightException{
		Map<String, Object> informatica=new HashMap<String, Object>();
		for(Tipo tipo:getFachadaTipo().pesquisa(getFachadaArea().getArea(new Long("1")))){
			informatica.put(tipo.getTipo(), tipo.getId());
		}
		return informatica;
	}
	
	public Map<String, Object>getListaTipoEspecificoInformatica() throws InsightException{
		Map<String, Object> listaEspecifica=new HashMap<String, Object>();
		for(TipoEspecifico tipoEspecifico:getFachadaTipoEspecifico().listarTipoEspecifico(getTipoInformatica().getId()==null?null:getTipoInformatica())){
			listaEspecifica.put(tipoEspecifico.getTipoEspecifico(), tipoEspecifico.getId());
		}
		return listaEspecifica;
	}
	
	public List<ConhecimentoLinguaEstrangeira> getListaConhecimentoLinguaEstrangeira() throws InsightException{
		return getFachadaConhecimentoLinguaEstrangeira().pesquisar(getUsuario());
	}
	
	public List<ConhecimentoInformatica> getListaConhecimentoInformatica() throws InsightException{
		return getFachadaConhecimentoInformatica().pesquisar(getUsuario());
	}
	
	private ConhecimentoLinguaEstrangeira conhecimentoLinguaEstrangeiraObject(ConhecimentoLinguaEstrangeira conhecimentoLinguaEstrangeira) {
		ConhecimentoLinguaEstrangeira estrangeira=new ConhecimentoLinguaEstrangeira(conhecimentoLinguaEstrangeira.getUsuario(),getTipoEspecificoLinguaEstrangeira(),conhecimentoLinguaEstrangeira.getTipo());
		estrangeira.setLeitura(conhecimentoLinguaEstrangeira.getLeitura());
		estrangeira.setEscrita(conhecimentoLinguaEstrangeira.getEscrita());
		estrangeira.setConversacao(conhecimentoLinguaEstrangeira.getConversacao());
		return estrangeira;
	}
	
	private ConhecimentoInformatica conhecimentoInformatica(ConhecimentoInformatica informatica){
		ConhecimentoInformatica conhecimentoInformatica=new ConhecimentoInformatica(informatica.getUsuario(),getTipoEspecificoInformatica(),getTipoInformatica());
		conhecimentoInformatica.setDominio(informatica.getDominio());
		return conhecimentoInformatica;
	}
}